<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        //详细介绍参照：https://segmentfault.com/a/1190000013035407
        //基本用法
            var a = {};
            Object.defineProperty(a,'name',{
                value: '小明'
            });
            console.log('对象a添加了name属性：' + a.name) //对象a添加了name属性：小明


        //writable：如果为false，属性的值就不能被重写,只能为只读了
        //configurable：总开关，一旦为false，就不能再设置他的（value，writable，configurable）
        //enumerable：是否能在for...in循环中遍历出来或在Object.keys中列举出来。
            function isObj(obj) {
                var type = Object.prototype.toString.call(obj);
                return type === '[object Object]';
            }
            
            function run(obj) {
                if(isObj(obj)){
                    new ObServer(obj)
                }
            }

            function ObServer(obj) { //执行赋值的构造函数
                this.data = obj;
                this.walk(obj);
            }

            ObServer.prototype.walk = function(obj) {
                for(var item in obj) {
                    def(obj, item, obj[item])
                }
            }

            function def(obj, item, val) {
                Object.defineProperty(obj, item, {
                    configurable: true,
                    enumerable: true,
                    get: function() {
                        console.log('get到值');
                        return val;
                    },
                    set: function(newval) {
                        if(val == newval) {
                            console.log('新值与原值一致，不赋值')
                            return;
                        }
                        val = newval;
                        console.log('set设置值')
                    }

                })
            }

            var student = {name: '小明', age: 20}
            run(student)
            student.name = '小明'

            // var b = {age:20};
            // Object.defineProperty(b,'age',{
            //     set: function(newVal) {
            //         console.log('通过b.**或者b[**]设置了属性的值：' + newVal);
            //     },
            //     get: function() {
            //         console.log('通过b.**或者b[**]获取了属性的值：');
            //     }
            // });

            // console.log();

    </script>
</body>
</html>